package com.yht.weblog.admin.utils;

import com.yht.weblog.admin.config.MinioProperties;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author: yht
 * @date: 2024/1/1 17:45
 * @description: Minio 工具类
 **/
@Component
@Slf4j
public class MinioUtil {
    @Autowired
    private MinioProperties minioProperties;

    @Autowired
    private MinioClient minioClient;

    /**
     * 上传文件
     *
     * @param file 文件
     * @return 文件路径
     */
    public String uploadFile(MultipartFile file) throws Exception {

        if (file == null || file.getSize() == 0) {
            log.error("==> 上传文件异常：文件大小为空...");
            throw new RuntimeException("文件大小不能为空");
        }

        // 文件的原始名称
        String originalFilename = file.getOriginalFilename();
        // 文件的Content-Type
        String contentType = file.getContentType();

        // 生成存储对象的名称（将 UUID 字符串中的 - 替换成空字符串）
        String key = UUID.randomUUID().toString().replace("-", "");
        // 获取文件的后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        // 拼接上文件后缀，即为要存储的文件名
        String objectName = String.format("%s%s", key, suffix);

        log.info("==> 开始上传文件至 Minio, ObjectName: {}", objectName);

        // 上传文件至 Minio
        // 使用MinioClient对象将文件上传到Minio存储桶中的指定对象
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioProperties.getBucketName()) // 设置存储桶名称
                .object(objectName) // 设置对象名称
                .stream(file.getInputStream(), file.getSize(), -1) // 设置上传的文件的输入流、大小和内容类型
                .contentType(contentType) // 设置上传文件的内容类型
                .build());


        String url = String.format("%s/%s/%s", minioProperties.getEndpoint(), minioProperties.getBucketName(), objectName);
        log.info("==> 上传文件至 Minio 成功, 文件访问地址: {}", url);

        return url;
    }
}
